package com.pizzaonline.servlets;

import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.List;
import java.util.Vector;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.catalina.Session;
import org.jdom.*;

import com.pizzaonline.JDBC.DataBase;
import com.pizzaonline.entites.Entite;
import com.pizzaonline.entites.Pizza;
import com.pizzaonline.entites.Salade;
import com.pizzaonline.utils.*;

/**
 * Servlet implementation class for Servlet: TratiterCommande
 *
 */
 public class TraiterCommande extends javax.servlet.http.HttpServlet implements javax.servlet.Servlet {
   static final long serialVersionUID = 1L;
   private Panier p;
   
    /* (non-Java-doc)
	 * @see javax.servlet.http.HttpServlet#HttpServlet()
	 */
	public TraiterCommande() {
		super();
	 
	}   	 	
	
	/* (non-Java-doc)
	 * @see javax.servlet.http.HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		//Mode UTF-8
		request.setCharacterEncoding("UTF-8");
		
		// Récupération de la session courante
		HttpSession s=request.getSession(true);
		// Récupération du panier
		p=(Panier)s.getAttribute("panier");
		PrintWriter out=response.getWriter();
		ServletContext c=this.getServletContext();
		// Création d'un élément XML pour stockage plus tard dans le fichier de commandes
		Element commande=new Element("Commande");
		String ingredientsModifies="";
		
		// Connexion à la base de donnnées
		DataBase d=new DataBase();
		
		d.connexionBD();
		Statement statement=d.getStatement();
		// Affectation du mode de paiement et de la date pour la commande
		commande.setAttribute("paiement",request.getParameter("modePaiement"));
		commande.setAttribute("date",new java.util.Date().toString());
		
		try
		{
			String login=(String)s.getAttribute("login");
			//commande.setAttribute("login",login);
			if (login==null)
			{
				out.write("<h4>Il semblerait que la session soit NULL... comment passer la session au servlet?... </h4>");
				return;
			}
			// récupération du nombre de commandes déjà effectuées par cet utilisateur
			ResultSet nbCommandes=statement.executeQuery("SELECT count(id_commande) FROM commande INNER JOIN utilisateur WHERE utilisateur.id_util=commande.id_client and utilisateur.id_util IN (SELECT id_util FROM utilisateur WHERE login='"+login+"')");
			nbCommandes.first();
			// ajout de l'id incrémenté de 1
			commande.setAttribute("id",String.valueOf((Long)nbCommandes.getObject(1)+1));
			XMLControler.readXMLFile(c.getRealPath("xml/carte.xml"));
			
		}catch (Exception e)
		{
			e.printStackTrace();
			out.write("Désolé, une erreur s'est produite! <a href=\"commande.jsp\">Retour</a>");
			return;
		}
		if (p==null)
		{
			out.write("Désolé, une erreur s'est produite! (p==null) <a href=\"commande.jsp\">Retour</a>");
			return;
		}
		Vector<Entite> entites=p.getEntites();
		Element items=new Element("Items");
		for (int i=0;i<entites.size();i++)
		{
			Entite e=entites.elementAt(i);
			Element item=new Element("Item");
			if (e.getNom().contains("perso"))
			{
				item.setAttribute("nom","Pizza personnalisée");
				item.setAttribute("perso","true");
			}
			else
				item.setAttribute("nom",e.getNom());
			    item.setAttribute("prix",String.valueOf(e.getPrix()));
			if (e instanceof Pizza)
			{
				Pizza p=(Pizza)e;
				String [] ingredients=p.getIngredients();
				if (ingredients==null)
				{
					Vector<String> v=XMLControler.getPizzaIngredients(p.getNom(), XMLControler.document);
					ingredients=new String[v.size()];
					for (int j=0;j<v.size();j++)
					{
						ingredients[j]=v.elementAt(j);
						if(j!=0)
							ingredientsModifies+="|";
						ingredientsModifies+=ingredients[j];
					}
				}
				for (int j=0;j<ingredients.length;j++)
				{
					if (p.isPerso())
					{
						Element ingredient=new Element("Ingredient");
						ingredient.setText(ingredients[j]);
						item.addContent(ingredient);
						if(j!=0)
							ingredientsModifies+="|";
						ingredientsModifies+=ingredients[j];
						
					}
					try {
						//d.update("stock","quantite=quantite-1", "nom='"+ingredients[i]+"'");
					}
					catch (Exception ex)
					{
						ex.printStackTrace();
					}
				}
				
			}
			else
				if (e instanceof Salade)
				{
					Salade salade=(Salade)e;
					Vector ingredients=XMLControler.getSaladeIngredients(salade.getNom(), XMLControler.document);


					for (int j=0;j<ingredients.size();j++)
					{
						try {
							//d.update("stock","quantite=quantite-1", "nom='"+ingredients.elementAt(i)+"'");
							ingredientsModifies+="|"+ingredients.elementAt(i);
						}
						catch (Exception ex)
						{
							ex.printStackTrace();
						}
					}
				}
			items.addContent(item);
		}
		commande.addContent(items);
		commande.setAttribute("prix",String.valueOf(p.getPrixTotal()));
		// commande automatique des ingrédients manquants
		try {
			//d.update("stock", "quantite=50","quantite < seuil");
			ResultSet id=d.select("id_util","utilisateur","login='"+s.getAttribute("login")+"'");
			id.first();
			int idClient=(Integer)id.getObject(1);
			boolean res=d.insert("commande","id_commande,id_client,montant,description,mode_paiement","null,"+idClient+","+p.getPrixTotal()+",'"+ingredientsModifies+"','"+request.getParameter("modePaiement")+"'");
			if (res)
			{
				System.out.println("L'insertion a échoué\n");
			}
			d.closeConnection();
			/*XMLControler.readXMLFile(c.getRealPath("xml/commandes.xml"));
			XMLControler.racine.addContent(commande);
			XMLControler.saveXMLFile(c.getRealPath("xml/commandes.xml"));*/
		}
		catch (Exception e)
		{
			e.printStackTrace();
		}
		out.write("<h3>Votre commande a bien été enregistrée!</h3><br /> Merci de nous faire confiance. <a href=\"index.jsp\"> Retourner à l'accueil</a>");
		
		p=new Panier();
		s.setAttribute("panier", p);
	}   	  	    
}